package com.heatup.apt.management.task;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.heatup.apt.common.dao.CompanyInfoMapper;
import com.heatup.apt.common.dao.SmsLogMapper;
import com.heatup.apt.common.util.SmsUtil;
import com.heatup.apt.management.util.ManageConfigPropertiesUtil;
import com.heatup.apt.model.SmsLog;
import com.heatup.apt.model.company.CompanyInfo;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 企业储值卡余额不足短信通知 每天上午10点定时任务类
 *
 * Created by blank on 2017/1/17.
 */
//@Component
//@EnableScheduling
public class CompanyValuedINotificationTask {

//    private static final Logger log = LoggerFactory.getLogger(CompanyValuedINotificationTask.class);

//    @Resource
//    private CompanyInfoMapper companyInfoMapper;

//    @Resource
//    private SmsLogMapper smsLogMapper;


    /**
     * java定时器：每天上午10点检测余额不足的企业储值卡企业账户 发送短信通知
     *
     * 字段   允许值   允许的特殊字符
     * 秒      0-59    , - * /
     * 分      0-59    , - * /
     * 小时    0-23    , - * /
     * 日期    1-31    , - * ? / L W C
     * 月份    1-12 或者 JAN-DEC    , - * /
     * 星期    1-7 或者 SUN-SAT    , - * ? / L C #
     * 年（可选）    留空, 1970-2099    , - * /
     *
     * 字符说明-----------
     *
     * “?”字符：表示不确定的值
     * “,”字符：指定数个值
     * “-”字符：指定一个值的范围
     * “/”字符：指定一个值的增加幅度。n/m表示从n开始，每次增加m
     * “L”字符：用在日表示一个月中的最后一天，用在周表示该月最后一个星期X
     * “W”字符：指定离给定日期最近的工作日(周一到周五)
     * “#”字符：表示该月第几个周X。6#3表示该月第3个周五
     *
     * Cron表达式范例-----------
     *
     * 每隔5秒执行一次：* /5 * * * * ? ---请注意  * /5 之间没有空格 此处因为注释报错而空开了
     * 每隔1分钟执行一次：0 * /1 * * * ?
     * 每天23点执行一次：0 0 23 * * ?
     * 每天凌晨1点执行一次：0 0 1 * * ?
     * 每月1号凌晨1点执行一次：0 0 1 1 * ?
     * 每月最后一天23点执行一次：0 0 23 L * ?
     * 每周星期天凌晨1点实行一次：0 0 1 ? * L
     * 在26分、29分、33分执行一次：0 26,29,33 * * * ?
     * 每天的0点、13点、18点、21点都执行一次：0 0 0,13,18,21 * * ?
     *
     * "0 0 12 * * ?" 每天中午12点触发
     * "0 15 10 ? * *" 每天上午10:15触发
     * "0 15 10 * * ?" 每天上午10:15触发
     * "0 15 10 * * ? *" 每天上午10:15触发
     * "0 15 10 * * ? 2005" 2005年的每天上午10:15触发
     * "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
     * "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
     * "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
     * "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
     * "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
     * "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
     * "0 15 10 15 * ?" 每月15日上午10:15触发
     * "0 15 10 L * ?" 每月最后一日的上午10:15触发
     * "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
     * "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
     * "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
     *
     *
     */
//    @Scheduled(cron = "0 0 10 * * ?")  //每天 上午10点 执行一次
//    @Scheduled(cron = "0 */5 * * * ?")  //每隔5分钟 执行一次 测试期间
//    public void task01(){

//        final String TOKEN_UPDATE_FLAG = ManageConfigPropertiesUtil.getString("token_update_flag").trim();
//
//        if ("1".equals(TOKEN_UPDATE_FLAG)) {
//            //测试/或正式环境才执行
//            long timeStart = System.currentTimeMillis();
//            log.info("企业储值卡余额不足短信通知定时任务 开始执行--------->>");
//
//            List<CompanyInfo> companyInfoList = companyInfoMapper.queryCompanyInfoList();
//            SmsLog smsLogRec = null;
//            labelA: for (CompanyInfo companyInfo : companyInfoList) {
//                //不足30%时通知
//                if(companyInfo.getCurrentLeftAmount().divide(companyInfo.getAmount(),1)
//                        .compareTo(new BigDecimal(0.3)) <= 0
//                        && StringUtils.isNotBlank(companyInfo.getClientManagerMobile())){
//
//                    //查询是否已经发送过 通知信息 如已发过则跳过不再发送
//                    SmsLog smsLog = new SmsLog();
//                    smsLog.setSendType(3);
//                    smsLog.setSendResult(1);
//                    smsLog.setCompanyName(companyInfo.getName());
//                    smsLog.setMobile(companyInfo.getClientManagerMobile());
//                    EntityWrapper<SmsLog> smsLogEntityWrapper = new EntityWrapper<>(smsLog);
//                    List<SmsLog> smsLogList = smsLogMapper.selectList(smsLogEntityWrapper);
//                    if (smsLogList !=null && smsLogList.size() > 0) {
//                        //如果已发送通知短信不是当天 则认为是旧通知 仍然需要再次通知
//                        //如果已发送通知短信是当天 则认为已经通知过 本次无需再次通知
//                        for (SmsLog s : smsLogList) {
//                            if(DateUtils.isSameDay(s.getSendTime(), new Date()))
//                                continue labelA;//跳出到上层 for 循环继续查找下一家公司
//                        }
//                    }
//                    boolean sendResult = SmsUtil.sendCompanyAmountNotificationSms(
//                            companyInfo.getClientManagerMobile(),
//                            companyInfo.getClientManager(),
//                            companyInfo.getName(),
//                            String.valueOf(companyInfo.getCurrentLeftAmount().intValue())
//                    );
//
//                    //发送记录
//                    smsLogRec = new SmsLog();
//                    smsLogRec.setMobile(companyInfo.getClientManagerMobile());
//                    smsLogRec.setCompanyName(companyInfo.getName());
//                    smsLogRec.setUserId(-1);
//                    smsLogRec.setSendTime(new Date());
//                    smsLogRec.setSendResult(sendResult ? 1 : 2);
//                    smsLogRec.setSendType(3);
//                    smsLogMapper.insertSelective(smsLogRec);
//
//                    log.info("发送企业储值余额不足通知短信 -->" + smsLogRec.toString());
//                }
//            }
//
//            long timeEnd = System.currentTimeMillis();
//            log.info("企业储值卡余额不足短信通知定时任务 执行完成---------<<< 总计耗时"+ (timeEnd - timeStart)/ DateUtils.MILLIS_PER_SECOND + "秒" );
//
//        }
//    }

}
